package jp.co.dailyReport;

import org.apache.log4j.Logger;
import java.text.SimpleDateFormat;
import java.util.Vector;
import jp.co.dailyReport.dailyReport.DailyReport;
import jp.co.dailyReport.weeklyReport.WeeklyReport;
import jp.co.dailyReport.dailyReport.DailyReportWorkItem;
import jp.co.dailyReport.weeklyReport.WeeklyReportWorkItem;
import jp.co.dailyReport.project.PjStaff;
import jp.co.dailyReport.project.Project;
import jp.co.dailyReport.project.PjStaffManager;
import jp.co.dailyReport.staff.Staff;
import jp.co.dailyReport.staff.StaffManager;
import jp.co.dailyReport.project.ProjectManager;
import jp.co.dailyReport.workItem.WorkItem;
import jp.co.dailyReport.workItem.WorkItemManager;

/**
 * メールクラス
 */
public class Mail {

	private static Logger log = Logger.getLogger(Mail.class);

	//日報メール送信元
	protected String transmissionDailyReport = Globals.get("MAIL_TRANSMISSION_DAILYREPORT");
	//週報メール送信元
	protected String transmissionWeeklyReport = Globals.get("MAIL_TRANSMISSION_WEEKLYREPORT");
	//日報メール送信先
	protected String receptionDailyReport = Globals.get("MAIL_RECEPTION_DAILYREPORT");
	//週報メール送信先
	protected String receptionWeeklyReport = Globals.get("MAIL_RECEPTION_WEEKLYREPORT");
	//メールサーバ
	protected String smtpServer = Globals.get("MAIL_SMTPSERVER");
	//件名
	protected String subject;
	//日報メール本文
	protected String dailyReportInfo;
	//週報メール送信先
	protected String weeklyReportInfo;

	/**
	 * 日報メール送信元アドレスを設定します。
	 * 
	 * @param transmissionDailyReport 日報メール送信元アドレス
	 */
	public void setTransmissionDailyReport(String transmissionDailyReport){
		this.transmissionDailyReport = transmissionDailyReport;
	}

	/**
	 * 日報メール送信元アドレスを取得します。
	 * 
	 * @return transmissionDailyReport
	 */
	public String getTransmissionDailyReport(){
		return transmissionDailyReport;
	}

	/**
	 * 週報メール送信元アドレスを設定します。
	 * 
	 * @param transmissionWeeklyReport 週報メール送信元アドレス
	 */
	public void setTransmissionWeeklyReport(String transmissionWeeklyReport){
		this.transmissionWeeklyReport = transmissionWeeklyReport;
	}

	/**
	 * 週報メール送信元アドレスを取得します。
	 * 
	 * @return transmissionWeeklyReport
	 */
	public String getTransmissionWeeklyReport(){
		return transmissionWeeklyReport;
	}

	/**
	 * 日報メール送信先アドレスを設定します。
	 * 
	 * @param receptionDailyReport 日報メール送信先アドレス
	 */
	public void setReceptionDailyReport(String receptionDailyReport){
		this.receptionDailyReport = receptionDailyReport;
	}

	/**
	 * 日報メール送信先アドレスを取得します。
	 * 
	 * @return receptionDailyReport
	 */
	public String getReceptionDailyReport(){
		return receptionDailyReport;
	}

	/**
	 * 週報メール送信先アドレスを設定します。
	 * 
	 * @param receptionWeeklyReport 週報メール送信先アドレス
	 */
	public void setReceptionWeeklyReport(String receptionWeeklyReport){
		this.receptionWeeklyReport = receptionWeeklyReport;
	}

	/**
	 * 週報メール送信先アドレスを取得します。
	 * 
	 * @return receptionWeeklyReport
	 */
	public String getReceptionWeeklyReport(){
		return receptionWeeklyReport;
	}

	/**
	 * メールサーバを設定します。
	 * 
	 * @param smtpServer メールサーバ
	 */
	public void setSmtpServer(String smtpServer){
		this.smtpServer = smtpServer;
	}

	/**
	 * メールサーバを取得します。
	 * 
	 * @return smtpServer
	 */
	public String getSmtpServer(){
		return smtpServer;
	}

	/**
	 * メールの件名を設定します。
	 * 
	 * @param subject メールの件名
	 */
	public void setSubject(String subject){
		this.subject = subject;
	}

	/**
	 * メールの件名を取得します。
	 * 
	 * @return subject
	 */
	public String getSubject(){
		return subject;
	}

	/**
	 * 日報メールの本文を設定します。
	 * 
	 * @param dailyReport 日報オブジェクト
	 */
	public void setDailyReportInfo(DailyReport dailyReport){

		StringBuffer buf = new StringBuffer();
		Staff staff = null;
		DailyReportWorkItem[] dailyReportWorkItemList = dailyReport.getDailyReportWorkItems();
		SimpleDateFormat DF = new SimpleDateFormat("HH:mm");

		try{
			staff = StaffManager.load(dailyReport.getStaffId());
			buf.append(Utilities.changeUniqueCharacter(staff.getName()) + "です。\r\n\r\n");
			buf.append(Utilities.getStrDate(dailyReport.getWorkDate()) + "の日報です。\r\n\r\n");

			buf.append("作業時間\r\n");
			buf.append(DF.format(dailyReport.getWorkingStartHours().getTime()) + " - " + DF.format(dailyReport.getWorkingEndHours().getTime()) + "\r\n\r\n");

			//日報の登録を行った社員の全ての作業項目の取得
			Vector workItemList = new Vector();
			PjStaff pjStaff[] = PjStaffManager.getProjectId(staff.getStaffId());
			for(int i = 0; i < pjStaff.length; i++) {
				//プロジェクトの存在ﾁｪｯｸ
				if(ProjectManager.isExist(pjStaff[i].getProjectId())){
					WorkItem[] workItems = WorkItemManager.load(pjStaff[i].getProjectId(),staff.getStaffId());
					for(int j = 0; j < workItems.length; j++) {
							workItemList.add(workItems[j]);
					}
				}
			}
			WorkItem[] workItems = (WorkItem[])workItemList.toArray(new WorkItem[0]);
			//日報作業項目の作業時間の表示
			if(dailyReportWorkItemList!=null){
				if(dailyReportWorkItemList.length!=0){
					int projectId = 0;
					for(int i=0;i<workItems.length;i++){
						for(int j=0;j<dailyReportWorkItemList.length;j++){
							if(workItems[i].getWorkItemId() == dailyReportWorkItemList[j].getWorkItemId()){
								if(projectId != workItems[i].getProjectId()){
									projectId = workItems[i].getProjectId();
									buf.append("■" + Utilities.changeUniqueCharacter(ProjectManager.load(projectId).getName()) + "\r\n");
								}
								buf.append(Utilities.changeUniqueCharacter(workItems[i].getName()) + "　" + dailyReportWorkItemList[j].getWorkingHours() + " h" + "\r\n");
							}
						}
					}
				}
			}

			buf.append("\r\n作業時間合計　　　" + dailyReport.getTotalWorkingHours() + " h" + "\r\n\r\n");
			buf.append("○作業内容詳細\r\n");
			buf.append(Utilities.changeUniqueCharacter(dailyReport.getWorkDetail()) + "\r\n\r\n");
			/*
			buf.append("○進捗状況\r\n");
			//日報作業項目の完成度の表示
			if(dailyReportWorkItemList!=null){
				if(dailyReportWorkItemList.length!=0){
					int projectId = 0;
					for(int i=0;i<workItems.length;i++){
						for(int j=0;j<dailyReportWorkItemList.length;j++){
							if(workItems[i].getWorkItemId() == dailyReportWorkItemList[j].getWorkItemId()){
								if(projectId != workItems[i].getProjectId()){
									projectId = workItems[i].getProjectId();
									buf.append("・" + Utilities.changeUniqueCharacter(ProjectManager.load(projectId).getName()) + "\r\n");
								}
								buf.append(Utilities.changeUniqueCharacter(workItems[i].getName()) + "　" + dailyReportWorkItemList[j].getCompleteness() + " %" + "\r\n");
							}
						}
					}
				}
			}
			*/
		} catch (DataUnavailableException due) {
			log.error(due.getMessage());
		}
		buf.append("\r\n○問題点\r\n");
		buf.append(Utilities.changeUniqueCharacter(dailyReport.getProblem()) + "\r\n\r\n");
		buf.append("○TODO\r\n");
		buf.append(Utilities.changeUniqueCharacter(dailyReport.getToDo()) + "\r\n\r\n");
		buf.append("○感想\r\n");
		buf.append(Utilities.changeUniqueCharacter(dailyReport.getComment()) + "\r\n\r\n");

		this.dailyReportInfo = buf.toString();
	}

	/**
	 * 日報メールの本文を取得します。
	 * 
	 * @return dailyReportInfo
	 */
	public String getDailyReportInfo(){
		return dailyReportInfo;
	}

	/**
	 * 週報メールの本文を設定します。
	 * 
	 * @param weeklyReport 週報オブジェクト
	 */
	public void setWeeklyReportInfo(WeeklyReport weeklyReport){

		StringBuffer buf = new StringBuffer();
		Staff staff = null;
		WeeklyReportWorkItem[] weeklyReportWorkItemList = weeklyReport.getWeeklyReportWorkItems();
		int projectId = weeklyReport.getProjectId();
		SimpleDateFormat df = new SimpleDateFormat("yyyy/MM/dd");

		try{
			staff = StaffManager.load(weeklyReport.getStaffId());
			buf.append(Utilities.changeUniqueCharacter(staff.getName()) + "です。\r\n\r\n");
			buf.append(Utilities.getStrDate(weeklyReport.getWorkDateStart()) + " - " + Utilities.getStrDate(weeklyReport.getWorkDateEnd()) + "の週報です。\r\n\r\n");

			Project project = ProjectManager.load(projectId);
			buf.append("●PJ概要\r\n");
			buf.append(Utilities.changeUniqueCharacter(project.getOutline()) + "\r\n\r\n");

			buf.append("●取引先体制\r\n");
			buf.append(Utilities.changeUniqueCharacter(project.getPjCustomerStaff()) + "\r\n\r\n");

			PjStaff[] pjStaff = PjStaffManager.getStaffId(projectId);
			buf.append("●ハウ体制\r\n");
			for(int i=0;i<pjStaff.length;i++){
				buf.append(Utilities.changeUniqueCharacter(StaffManager.load(pjStaff[i].getStaffId()).getName()) + "\r\n");
			}

			buf.append("\r\n●期間\r\n");
			buf.append(df.format(project.getPeriodStart().getTime()) + " - " + df.format(project.getPeriodEnd().getTime()) + "\r\n\r\n");

			buf.append("●線表/稼働時間\r\n");
			WorkItem[] workItemList = WorkItemManager.loadPId(projectId);
			for(int i = 0; i < workItemList.length; i++) {
				for(int j = 0; j < weeklyReportWorkItemList.length; j++) {
					if(workItemList[i].getAddStaffId()==0 && workItemList[i].getWorkItemId()==weeklyReportWorkItemList[j].getWorkItemId()){
						buf.append("・" + Utilities.changeUniqueCharacter(workItemList[i].getName()) + "　" + weeklyReportWorkItemList[j].getWorkingHours() + " h" + "\r\n");
					}
				}
			}
			buf.append("\r\n稼動時間合計　　　" + weeklyReport.getTotalHoursWorked() + " h" + "\r\n\r\n");

			buf.append("●問題点\r\n");
			buf.append(Utilities.changeUniqueCharacter(weeklyReport.getProblem()) + "\r\n\r\n");

			buf.append("●感想\r\n");
			buf.append(Utilities.changeUniqueCharacter(weeklyReport.getComment()) + "\r\n\r\n");


		} catch (DataUnavailableException due) {
			log.error(due.getMessage());
		}

		this.weeklyReportInfo = buf.toString();
	}

	/**
	 * 週報メールの本文を取得します。
	 * 
	 * @return weeklyReportInfo
	 */
	public String getWeeklyReportInfo(){
		return weeklyReportInfo;
	}

}
